ホームに戻る
関連 :
MVVMパターン MVVM Toolkit 変更通知プロパティ コマンド
目次 :

DataContext とは

MVVMパターン における ViewModel を担うクラスで、View ( Window または UserControl )のプロパティとして設定する。 この DataContext を介して、View と ViewModel が接続される。 DataContext における重要な要素は以下の2つ。
変更通知プロパティ
ViewModel のプロパティ変化を View に通知
コマンド
View の操作を ViewModel に通知
ユーザの操作はUI( View )に対して行われるが、UIに関する処理は ViewModel ( DataContext )で完結させるのがMVVMパターンにおける原則である。 (コードビハインドの記述を最小限に留める。通常、コードビハインドにはコンストラクタしか記述されない。) ただし、コードビハインドでの処理が適する場合も存在する。 Visual Studioで Window や UserControl を作成した際、View (XAMLとコードビハインドの対)は作成されるが、ViewModel はいかなる場合も自動では作成されない(MVVMに準拠した構成とならない)。 (このため、コードビハインドが ViewModel だと誤解されることも多いが誤りである。) 変更通知プロパティやコマンドを含めた ViewModel の実装を自力で行うと記述が非常に煩雑となるが、 MVVM Toolkit等のライブラリを活用することでコードの記述を大幅に削減できる。

DataContext ( ViewModel )の実装

任意のクラスを ViewModel として新たに作成し、View の DataContext に指定する。

ViewModel の作成

ViewModel : MainViewModel.cs
namespace Sample { // ViewModel の本体 class MainViewModel { // プロパティ public string Message { get; set; } = "サンプルメッセージ"; } }

DataContext の指定

XAMLで行う場合

View : MainWindow.xaml
<Window x:Class="BucketRelay.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:BucketRelay" mc:Ignorable="d" d:DataContext="{d:DesignInstance Type=local:MainViewModel}" <!-- デザイナ上で MainViewModel を参照する際に指定 --> (略) > <!-- MainViewModel を DataContext に設定 --> <Window.DataContext> <local:MainViewModel /> </Window.DataContext> : <!-- TextBlock.Text を DataContext ( MainViewModel )の Message とバインド --> <TextBlock Text="{Binding Message}" />
ここでは MainViewModel を Window の DataContext として設定している。 Window のタグ中で d:DataContext の指定を併せて行っておくと、デザイナから ViewModel を参照でき、IntelliSenseの支援が受けられる。 注意が必要な点として、XAMLから DataContext の指定を行う場合、呼び出せる ViewModel のコンストラクタはデフォルトコンストラクタ(引数の無いコンストラクタ)に限定される。 このため、デフォルトコンストラクタ以外を呼びたい場合はコードビハインドで指定を行うなどの回避策をとる必要がある。 DataContext の指定を Window タグに含めることも可能である。
<Window (略) DataContext="local:MainViewModel" (略) > (略)

コードビハインドで行う場合

View : MainWindow.xaml.cs
namespace Sample { public partial class MainWindow : Window { // コンストラクタ public MainWindow() { InitializeComponent(); this.DataContext = new MainViewModel(); } } }
DataContext の指定はコードビハインドから行うことも可能である(通常はXAMLから行うことが推奨される)。 その場合はコンストラクタ中で ViewModel のインスタンスを DataContext に代入する。 前述の通り ViewModel がデフォルトコンストラクタを持たない場合はXAMLからの指定ができないため、コードビハインドで行う。